home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 1 Issue 2
/
PDCD-1 - Issue 02.iso
/
_utilities
/
utilities
/
001
/
infobar
/
!InfoBar
/
0_04
(
.txt
)
< prev
next >
Wrap
RISC OS BBC BASIC V Source
|
1994-09-26
|
23KB
|
577 lines
>InfoBar:0_04
Display time/date/free memory/mode simple readout
David G Jones, 1994
This software is PD, do what you will with it.
$; " (Error code ";
); ")":
SReplaceResource% =
:
Whether we create our own smaller ResourceFiler icon
MStopWelcome% =
:
Stop Welcome screen on starting up the desktop
1prog$ = "InfoBar": vers$="0.04 (25 Sep 1994)"
Start & Finish external coordinates of the various displays. Order of displays is
important within the rloop section
(DateX0% = 0 * 16: DateX1% = 7 * 16
(TimeX0% = 8 * 16: TimeX1% = 14 * 16
(ModeX0% = 15 * 16: ModeX1% = 18 * 16
(FreeX0% = 19 * 16: FreeX1% = 26 * 16
command$="Desktop_"+prog$
bl$ =
cr$ =
nl% = &0A0D
"Service_Reset = &27
"Service_StartWimp = &49
"Service_StartedWimp = &4A
"Service_MemoryMoved = &4E
"Service_DesktopWelcome = &7C
assembly
"OS_File", 10, prog$, &FFA,, code, O%
assembly
code 16383
pass% = 4
O% = code: P% = 0
[ OPT pass%
(! equd start
equd 0
*! equd final
+' equd serviceCall
,' equd titleString
-& equd helpString
.$ equd keyWords
equd 0
equd 0
equd 0
equd 0
4-.titleString equs prog$ +bl$: align
5O.helpString equs prog$+
(9)+vers$+" David G Jones"+bl$: align
.keyWords
80.startUpName equs command$ +bl$: align
9' equd startUpComm
equd 0
;' equd startUpHelp
<' equd startUpHelp
.keyWords_end equd 0
.startUpHelp equs "InfoBar displays a row of useful readouts along the top left of the icon bar; Date, time, mode and free memory.": equw nl%
@T equs "Do not use *"+command$+", use *Desktop instead.": equw nl%
A4 equs "Syntax: *"+command$+bl$
align
D2.serviceCall teq r1, #Service_StartWimp
E4 teqNE r1, #Service_StartedWimp
F. teqNE r1, #Service_Reset
G4 teqNE r1, #Service_MemoryMoved
StopWelcome%: [OPT pass%: teqNE r1, #Service_DesktopWelcome:]
I#[ OPT pass%: movNES pc, r14
K2 teq r1, #Service_StartWimp
L% bEQ startWimp
M4 teq r1, #Service_StartedWimp
N' bEQ startedWimp
O. teq r1, #Service_Reset
P( bEQ serviceReset
Q4 teq r1, #Service_MemoryMoved
R( strEQ r1, PollWord
StopWelcome%:[OPT pass%:teq r1, #Service_DesktopWelcome:]:
T"[ OPTpass%: movEQ r1, #0
V# movS pc, r14
X+.startWimp ldr r12, taskHandle
Y# teq r12, #0
Z# mvnEQ r12, #0
[+ strEQ r12, taskHandle
\+ adrEQ r0, startUpName
]" movEQ r1, #0
^# movS pc, r14
`+.startedWimp ldr r12, taskHandle
a# cmn r12, #1
b# movEQ r12, #0
c+ strEQ r12, taskHandle
d# movS pc, r14
f#.serviceReset mov r12, #0
g+ str r12, taskHandle
h# movS pc, r14
j..startUpComm stmfd r13!, {r0-r2, r14}
k" mov r2, r0
l" mov r0, #3
m/ swi "XWimp_ReadSysInfo"
n/ ldmVSfd r13!, {r0 - r2, pc}
o" teq r0, #0
p, adrEQ r0, notInDesktop
q. swiEQ "OS_GenerateError"
r+ adr r1, titleString
s" mov r0, #2
t( swi "XOS_Module"
u- ldmfd r13!, {r0-r2, pc}
.notInDesktop equd 0
x> equs "Use *Desktop to start "+prog$+bl$
align
.taskHandle equd 0
}'.wimpError ldr r1, PollMask
~O tst r1, #1 << 31 ; Are we still in wimp init?
$ movEQ r1, #%011
$ movNE r1, #%010
' adr r2, TaskName
- swi "Wimp_ReportError"
! teq r1, #1
# bEQ continue
$ b closeDown
L.NoTemplate equd 0: equs "Could not find window template" +bl$: align
:.TemplatesFN equs "InfoBar:Templates" +bl$: align
1.Grabkeys equs "grabkeys" +bl$: align
1.TaskName equs "Info Bar" +bl$: align
P.Messages equd &400c1: equd &400c2: equd &400c3: equd &400c4: equd 0
W.PollMask equd %0010000000001100001110000
(1 << 31) ;mark not set up yet
.PollWord equd 0
P.start mov r0, #256 ; Minimum version 3.10
- add r0, r0, #310 - 256
# ldr r1, TASK
' adr r2, TaskName
' adr r3, Messages
- swi "XWimp_Initialise"
$ bVS wimpError
) str r1, taskHandle
* adr r1, TemplatesFN
/ swi "XWimp_OpenTemplate"
$ bVS wimpError
*
adrl("", 1, WimpBlock)
' add r2, r1, #128
% add r3, r2, #0
! mvn r4, #0
' adr r5, Grabkeys
! mov r6, #0
/ swi "XWimp_LoadTemplate"
$ bVS wimpError
! teq r6, #0
) adrEQ r0, NoTemplate
$ bEQ wimpError
& mvn r2, #&10000
' str r2, [r1, #0]
( add r2, r2, #&100
' str r2, [r1, #8]
/ swi "XWimp_CreateWindow"
' strVC r0, [r1, #0]
1 swiVC "XWimp_GetWindowState"
- swiVC "XWimp_OpenWindow"
$ bVS wimpError
' add r2, r1, #128
% add r3, r2, #0
K mvn r4, #0 ; No font support
* adr r5, titleString
Z mov r6, #0 ; First search for template name
/ swi "XWimp_LoadTemplate"
$ bVS wimpError
S teq r6, #0 ; Was the template found?
L adrEQ r0, NoTemplate ; >No So complain
; bEQ wimpError ;
/ swiVC "XWimp_CreateWindow"
, strVC r0, InfoBarHandle
Q movVC r2, r0 ; r2 == info bar handle
R mvnVC r0, #1 ; icon bar window handle
' strVC r0, [r1, #0]
1 swiVC "XWimp_GetWindowState"
V add r4, r1, #4 ; r4 => visible area details
W ldmia r4, {r5 - r8} ; r5 == min x ... r8 == max y
Q ldrVC r3, [r1, #28] ; r3 == icon bar behind
S strVC r2, [r1, #0] ; Ok get info bar details
1 swiVC "XWimp_GetWindowState"
G addVC r7, r5, # FreeX1% ; r7 == max x
H mvnVC r0, #0 ; Current mode
F movVC r1, #5 ; YEigFactor
1 swiVC "XOS_ReadModeVariable"
W movVC r0, #1 ; vertical space around chars
) movVC r0, r0, LSL r2
W addVC r0, r0, #32 ; Static height of characters
G subVC r6, r8, r0 ; r6 == min y
V stmIA r4, {r5 - r8} ; store visible area details
K subVC r1, r4, #4 ; r1 => WimpBlock
O strVC r3, [r1, #28] ; open above icon bar
- swiVC "XWimp_OpenWindow"
$ bVS wimpError
0 swi "XWimp_CloseTemplate"
$ bVS wimpError
ReplaceResource%
[ OPT pass%
) mov r0, #&50000000
,
adrl("", 1, RomAppsIcon)
- swi "XWimp_CreateIcon"
$ bVS wimpError
[ OPT pass%
' ldr r0, PollMask
S bic r0, r0, #1 << 31 ;Finished wimp init, so GO Go Go
' str r0, PollMask
'.continue
adrl("", 13, Stack)
$ b updateAll
".wimpPoll mov r0, #14
( adr r1, WimpBlock
! mov r2, #3
' str r2, [r1, #0]
% swi "XOS_Word"
! mvnVC r0, #0
% addVC r2, r1, #8
= swiVC "XTerritory_ConvertTimeToOrdinals"
' ldrVC r1, [r2, #4]
& rsbVC r1, r1, #60
2 swiVC "XOS_ReadMonotonicTime"
$ bVS wimpError
8 add r1, r1, r1, LSL #2 ;(r1 * 5
< add r1, r1, r1, LSL #2 ; * 5
W add r2, r0, r1, LSL #2 ; * 4) + r0 == r1 * 100 + r0
' ldr r0, PollMask
( adr r1, WimpBlock
' adr r3, PollWord
+ swi "XWimp_PollIdle"
$ bVS wimpError
! cmp r0, #1
L bLT updateTime ; Null_Reason_Code
/ swiEQ "XWimp_RedrawWindow"
$ bVS wimpError
bEQ rloop
H teq r0, #17 ; User_Message
Q teqNE r0, #18 ; User_Message_Recorded
) bEQ receiveMessage
N teq r0, #13 ; Poll word non-zero
# bEQ pollWord
G teq r0, #8 ; Key_Pressed
# bEQ keypress
ReplaceResource%
G[ OPT pass%: teq r0, #6 ; Mouse_Click
) bEQ mouseclick :]
[ OPT pass%
# b wimpPoll
X.keypress ldr r0, [r1, #24] ; r0 == character code pressed
K teq r0, #&1DC ; Is it Shift-F12
Z strEQ r0, PollWord ; >Yes Mark infobar to be opened
Q swi "XWimp_ProcessKey" ; Pass on character key
# bVC wimpPoll
$ b wimpError
M.pollWord ldr r2, PollWord ; r2 == poll reason
! mov r3, #0
K str r3, PollWord ; clear poll word
3 teq r2, #Service_MemoryMoved
% bEQ updateFree
W; Icon bar has changed position in window heap so reopen our window infront of ibar
!R mvn r0, #1 ; icon bar window handle
"' str r0, [r1, #0]
#1 swi "XWimp_GetWindowState"
$( ldrVC r2, [r1, #28]
%, ldrVC r0, InfoBarHandle
&' strVC r0, [r1, #0]
'1 swiVC "XWimp_GetWindowState"
(( strVC r2, [r1, #28]
)- swiVC "XWimp_OpenWindow"
*# bVC wimpPoll
+$ b wimpError
-'.updateTime bL readTimeDate
.T ldr r0, Date ; Load current date string
/U ldr r1, DateOldWord ; Load previous date string
0Q teq r0, r1 ; Has the date changed?
1O strNE r0, DateOldWord ; >Yes Store new date
2Z movNE r2, #DateX0% ; Set min X to Date section
3Z movEQ r2, #TimeX0% ; >No Set min X to Time section
4' mov r4, #TimeX1%
5' b updateWindow
7&.updateFree ldr r7, FreeOld
8# bL readFree
9& ldr r0, FreeOld
:! teq r0, r7
;# bEQ wimpPoll
<' mov r2, #FreeX0%
=' mov r4, #FreeX1%
>' b updateWindow
@'.updateAll bL readTimeDate
A# bL readMode
B# bL readFree
C' mov r2, #DateX0%
D' mov r4, #FreeX1%
E' b updateWindow
; Read both time & date
H(.readTimeDate adr r1, WimpBlock
I" mov r0, #14
J! mov r2, #3
K' str r2, [r1, #0]
L% swi "XOS_Word"
M$ bVS wimpError
O1; calculate time from stored 5-byte real time
P(.readTimeDate0 adr r0, WimpBlock
Q# adr r1, Time
R! mov r2, #8
S) adr r3, TimeFormat
T3 swi "XOS_ConvertDateAndTime"
U$ bVS wimpError
V% sub r2, r1, r0
WU ldrB r1, [r0] ; Clear pre-"0" if it is there
X' teq r1, #
("0")
Y% subEQ r2, r2, #1
Z) str r2, TimeLength
[( bNE readTimeDate1
\'.loop ldrB r1, [r0, #1]
]' strB r1, [r0], #1
^% subS r2, r2, #1
bGT loop
a1; calculate date from stored 5-byte real time
b(.readTimeDate1 adr r0, WimpBlock
c# adr r1, Date
d! mov r2, #8
e) adr r3, DateFormat
f3 swi "XOS_ConvertDateAndTime"
g$ bVS wimpError
h% sub r2, r1, r0
iV ldrB r1, [r0] ; Clear pre-"0" if it is there
j' teq r1, #
("0")
k% subEQ r2, r2, #1
l) str r2, DateLength
m" movNES pc, r14
n'.loop ldrB r1, [r0, #1]
o' strB r1, [r0], #1
p% subS r2, r2, #1
bGT loop
s" movS pc, r14
u!.readMode mvn r0, #0
v! mov r1, #5
w1 swi "XOS_ReadModeVariable"
x) str r2, YEigFactor
y! mov r0, #1
z. swi "XWimp_ReadSysInfo"
{# adrVC r1, Mode
|! movVC r2, #8
}1 swiVC "XOS_ConvertCardinal1"
~% subVC r1, r1, r0
) strVC r1, ModeLength
" movVCS pc, r14
$ b wimpError
!.readFree mvn r0, #0
! mvn r1, #0
+ swi "XWimp_SlotSize"
! movVC r0, r2
& strVC r0, FreeOld
# adrVC r1, Free
" movVC r2, #12
0 swiVC "XOS_ConvertFileSize"
$ bVS wimpError
! mov r2, #0
'.loop ldrB r1, [r0], #1
" cmp r1, #32
' bLT readfree_end
" cmp r1, #80
% addLE r2, r2, #1
bLE loop
).readfree_end str r2, FreeLength
" movS pc, r14
.receiveMessage
( ldr r2, [r1, #16]
* sub r3, r2, #&40000
# cmp r3, #&c1
# bLEQ readMode
# bEQ wimpPoll
# teq r3, #&C2
# teqNE r3, #&C3
# teqNE r3, #&C4
% bEQ updateFree
! teq r2, #0
# bNE wimpPoll
).closeDown ldr r0, taskHandle
# ldr r1, TASK
, swi "XWimp_CloseDown"
! mov r0, #0
) str r0, taskHandle
,
adrl("", 3, titleString)
* swi "OS_ExitAndDie"
&.final stmFD r13!, {r14}
) ldr r0, taskHandle
! teq r0, #0
# ldrGT r1, TASK
, swiGT "XWimp_CloseDown"
! mov r1, #0
) str r1, taskHandle
% ldmFD r13!, {pc}
!.TASK equs "TASK"
#.Date
defineMemory(8)
.DateOldWord equd 0
.DateLength equd 0
0.DateFormat equs "%DY %M3" +bl$: align
#.Time
defineMemory(8)
.TimeLength equd 0
0.TimeFormat equs "%12:%MI" +bl$: align
#.Mode
defineMemory(8)
.ModeLength equd 0
$.Free
defineMemory(12)
.FreeLength equd 0
.FreeOld equd -1
.InfoBarHandle equd 0
&.WimpBlock
defineMemory(256)
.Stack
.YEigFactor equd 2
; r2 = start x ;r4 = end x
(.updateWindow adr r1, WimpBlock
, ldr r0, InfoBarHandle
" mvn r3, #63
! mov r5, #0
, stmIA r1, {r0, r2 - r5}
/ swi "XWimp_UpdateWindow"
$ bVS wimpError
!.rloop teq r0, #0
# bEQ wimpPoll
-.rloop_start ldr r8, WimpBlock + 4
- ldr r9, WimpBlock + 16
* ldr r10, YEigFactor
- ldr r1, WimpBlock + 28
- ldr r7, WimpBlock + 36
' cmp r1, #FreeX0%
! bGE rloop4
' cmp r1, #ModeX0%
! bGE rloop3
' cmp r1, #TimeX0%
! bGE rloop2
0 ; Draw out the date component
,.rloop1 mov r3, #DateX0%
1 mov r4, #DateX1% - DateX0%
# adr r5, Date
) ldr r6, DateLength
bL draw
' cmp r7, #TimeX0%
$ bLT rloop_end
0 ; draw out the time component
$.rloop2 mov r3, #TimeX0%
. mov r4, #TimeX1% - TimeX0%
adr r5, Time
& ldr r6, TimeLength
bL draw
' cmp r7, #ModeX0%
$ bLT rloop_end
; Mode
$.rloop3 mov r3, #ModeX0%
. mov r4, #ModeX1% - ModeX0%
adr r5, Mode
& ldr r6, ModeLength
bL draw
' cmp r7, #FreeX0%
$ bLT rloop_end
; Free memory
$.rloop4 mov r3, #FreeX0%
. mov r4, #FreeX1% - FreeX0%
adr r5, Free
& ldr r6, FreeLength
bL draw
(.rloop_end adr r1, WimpBlock
/ swi "XWimp_GetRectangle"
$ bVS wimpError
! teq r0, #0
& bNE rloop_start
# b wimpPoll
C; r3 - start x; r4 - width; r5 - ptr to string; r6 - string len
!.draw mov r0, #2
, swi "XWimp_SetColour"
! movVC r0, #4
% addVC r1, r8, r3
! movVC r2, r9
% swiVC "XOS_Plot"
& movVC r0, #96 + 1
! movVC r1, r4
' mvnVC r2, #31 + 16
% swiVC "XOS_Plot"
- subVC r1, r4, r6, LSL #4
- addVC r1, r3, r1, ASR #1
% addVC r1, r1, r8
! movVC r2, #2
* movVC r2, r2, LSL r10
% subVC r2, r9, r2
!! movVC r0, #4
"% swiVC "XOS_Plot"
#! movVC r0, #7
$, swiVC "XWimp_SetColour"
%! movVC r0, r5
&! movVC r1, r6
'' swiVC "XOS_WriteN"
(" movVCS pc, r14
)$ b rloop_end
ReplaceResource%
[OPT pass%
-D; Replacement ResourceFiler icon (because it is too high on bar)
.'.mouseclick ldr r2, [r1, #8]
/$ teq r2, #%100
0( adrEQ r0, Resources
1$ swiEQ "XOS_CLI"
2$ bVS wimpError
3$ teq r2, #%001
4) adrEQ r0, Resources1
5$ swiEQ "XOS_CLI"
6# bVC wimpPoll
7$ b wimpError
9G.Resources equs "Filer_OpenDir Resources:$.Apps" +bl$: align
:G.Resources1 equs "Filer_OpenDir Resources:$" +bl$: align
.RomAppsIcon equd -5
<2 equd 0: equd 0: equd 68: equd 68
=B equd &1700203A:
equsPadWithTo("romapps", 0, 12)
[ OPT pass%
pass%
defineMemory(A%)
fill(0, A%)
equsPadWithTo(string$, pad%, length%)
This stores the string$. Ensuring it is pad% terminated, and altogether
takes length% bytes. (Pads all with pad%)
short$, temp$
N#short$ =
string$, length% - 1)
O"[ OPT pass%: equs short$: ]
P,temp$ =
fill(pad%, length% -
(short$))
fill(byte, count)
This fills in count bytes with the value in byte
loop
count <= 0
"Assigning zero space here!": =0
loop = 1
count
Z! [ OPT pass%: equb byte: ]
loop
[ OPT pass%: ALIGN: ]
adrl(c$,r%,addr%)
c%,df%,byte_lo%,byte_hi%,opcode1%,opcode2%
addr%=P%
(pass%
12)=0
P%+=8:O%+=8:=0
(addr%-P%)<256
error("ADRL failed: Address within range when setting R"+
r%+" to "+
addr%,-1)
(addr%-P%)>65535
error("ADRL failed: Address outside range when setting R"+
r%+" to "+
addr%,-1)
c$=" "
c$="" c$="AL"
e.c%=
"EQNECSCCMIPLVSVCHILSGELTGTLEALNV",c$)
c%=0
error("ADRL failed: ARM condition code not recognized when setting R"+
r%+" to "+
addr%,-1)
c%=(c%-1)
df%=addr%-P%-8
byte_lo%=
(df%)
byte_hi%=
(df%)
&FF00
df%>=0
k3 opcode1%=(c%<<28)+&028F0000+(r%<<12)+byte_lo%
lA opcode2%=(c%<<28)+&02800C00+(r%<<16)+(r%<<12)+(byte_hi%>>8)
n3 opcode1%=(c%<<28)+&024F0000+(r%<<12)+byte_lo%
oA opcode2%=(c%<<28)+&02400C00+(r%<<16)+(r%<<12)+(byte_hi%>>8)
q,[OPT pass%:EQUD opcode1%:EQUD opcode2%:]